'use strict'
/* -------------------- 判断操作 --------------------*/
module.exports = {
  // 是否字符串
  isString (o) {
    return Object.prototype.toString.call(o).slice(8, -1) === 'String'
  },
  // 是否数字
  isNumber (o) {
    return Object.prototype.toString.call(o).slice(8, -1) === 'Number'
  },
  // 是否boolean
  isBoolean (o) {
    return Object.prototype.toString.call(o).slice(8, -1) === 'Boolean'
  },
  // 是否函数
  isFunction (o) {
    return Object.prototype.toString.call(o).slice(8, -1) === 'Function'
  },
  // 是否为null
  isNull (o) {
    return Object.prototype.toString.call(o).slice(8, -1) === 'Null'
  },
  // 是否undefined
  isUndefined (o) {
    return Object.prototype.toString.call(o).slice(8, -1) === 'Undefined'
  },
  // 是否对象
  isObj (o) {
    return Object.prototype.toString.call(o).slice(8, -1) === 'Object'
  },
  // 是否数组
  isArray (o) {
    return Object.prototype.toString.call(o).slice(8, -1) === 'Array'
  },
  // 是否时间
  isDate (o) {
    return Object.prototype.toString.call(o).slice(8, -1) === 'Date'
  },
  // 是否正则
  isRegExp (o) {
    return Object.prototype.toString.call(o).slice(8, -1) === 'RegExp'
  },
  // 是否错误对象
  isError (o) {
    return Object.prototype.toString.call(o).slice(8, -1) === 'Error'
  },
  // 是否Symbol函数
  isSymbol (o) {
    return Object.prototype.toString.call(o).slice(8, -1) === 'Symbol'
  },
  // 是否Promise对象
  isPromise (o) {
    return Object.prototype.toString.call(o).slice(8, -1) === 'Promise'
  },
  // 是否Set对象
  isSet (o) {
    return Object.prototype.toString.call(o).slice(8, -1) === 'Set'
  },
  // 是否是false
  isFalse (o) {
    if (o == '' || o == undefined || o === null || o == 'null' || o == 'undefined' || o == 0 || o == false || isNaN(o)) { return true }
    return false
  },
  // 是否是true
  isTrue (o) {
    return !this.isFalse(o)
  },
  // 是否是手机端及手机型号
  isIos () {
    var u = navigator.userAgent
    if (u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) {
      // 安卓手机
      return 'Android'
    } else if (u.indexOf('iPhone') > -1) {
      // 苹果手机
      return 'iPhone'
    } else if (u.indexOf('iPad') > -1) {
      // iPad
      return 'iPad'
    } else if (u.indexOf('Windows Phone') > -1) {
      // winphone手机
      return 'Windows Phone'
    }
    return false

  },
  // 是否为PC端
  isPC () {
    var userAgentInfo = navigator.userAgent
    var Agents = ['Android', 'iPhone','SymbianOS','Windows Phone','iPad','iPod']
    var flag = true
    for (var v = 0; v < Agents.length; v++) {
      if (userAgentInfo.indexOf(Agents[v]) > 0) {
        flag = false
        break
      }
    }
    return flag
  },
  // 浏览器类型
  browserType (){
    var userAgent = navigator.userAgent            // 取得浏览器的userAgent字符串
    var isOpera = userAgent.indexOf('Opera') > -1  // 判断是否Opera浏览器
    var isIE = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1 && !isOpera  // 判断是否IE浏览器
    var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf('rv:11.0') > -1            // 判断是否IE 11浏览器
    var isEdge = userAgent.indexOf('Edge') > -1 && !isIE                  // 判断是否IE的Edge浏览器
    var isFF = userAgent.indexOf('Firefox') > -1                          // 判断是否Firefox浏览器
    var isSafari = userAgent.indexOf('Safari') > -1 && userAgent.indexOf('Chrome') == -1    // 判断是否Safari浏览器
    var isChrome = userAgent.indexOf('Chrome') > -1 && userAgent.indexOf('Safari') > -1     // 判断Chrome浏览器
    if (isIE) {
      var reIE = new RegExp('MSIE (\\d+\\.\\d+);')
      reIE.test(userAgent)
      var fIEVersion = parseFloat(RegExp['$1'])
      if(fIEVersion == 7) { return 'IE7' }
      else if(fIEVersion == 8) { return 'IE8' }
      else if(fIEVersion == 9) { return 'IE9' }
      else if(fIEVersion == 10) { return 'IE10' }
      // IE版本过低
      return 'IE7以下'
    }
    if (isIE11) { return 'IE11' }
    if (isEdge) { return 'Edge' }
    if (isFF) { return 'FF' }
    if (isOpera) { return 'Opera' }
    if (isSafari) { return 'Safari' }
    if (isChrome) { return 'Chrome' }
  },
  checkStr (str, type) {
    switch (type) {
    // 手机号码
    case 'phone':
      return /^1[3|4|5|6|7|8][0-9]{9}$/.test(str)
      // 座机
    case 'tel':
      return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str)
      // 身份证
    case 'card':
      return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str)
      // 密码以字母开头，长度在6~18之间，只能包含字母、数字和下划线
    case 'pwd':
      return /^[a-zA-Z]\w{5,17}$/.test(str)
      // 邮政编码
    case 'postal':
      return /[1-9]\d{5}(?!\d)/.test(str)
      // QQ号
    case 'QQ':
      return /^[1-9][0-9]{4,9}$/.test(str)
      // 邮箱
    case 'email':
      return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str)
      // 金额(小数点2位)
    case 'money':
      return /^\d*(?:\.\d{0,2})?$/.test(str)
      // 网址
    case 'URL':
      return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)
      // IP
    case 'IP':
      return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str)
      // 日期时间
    case 'date':
      return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
      // 数字
    case 'number':
      return /^[0-9]$/.test(str)
      // 英文
    case 'english':
      return /^[a-zA-Z]+$/.test(str)
      // 中文
    case 'chinese':
      return /^[\u4E00-\u9FA5]+$/.test(str)
      // 小写
    case 'lower':
      return /^[a-z]+$/.test(str)
      // 大写
    case 'upper':
      return /^[A-Z]+$/.test(str)
      // HTML标记
    case 'HTML':
      return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str)
    default:
      return true
    }
  },
  // 严格的身份证校验
  isCardID (sId) {
    if (!/(^\d{15}$)|(^\d{17}(\d|X|x)$)/.test(sId)) {
      return '你输入的身份证长度或格式错误'
    }
    // 身份证城市
    var aCity={11: '北京',12: '天津',13: '河北',14: '山西',15: '内蒙古',21: '辽宁',22: '吉林',23: '黑龙江',31: '上海',32: '江苏',33: '浙江',34: '安徽',35: '福建',36: '江西',37: '山东',41: '河南',42: '湖北',43: '湖南',44: '广东',45: '广西',46: '海南',50: '重庆',51: '四川',52: '贵州',53: '云南',54: '西藏',61: '陕西',62: '甘肃',63: '青海',64: '宁夏',65: '新疆',71: '台湾',81: '香港',82: '澳门',91: '国外'}
    if(!aCity[parseInt(sId.substr(0,2))]) {
      return '你的身份证地区非法'
    }
    // 出生日期验证
    var sBirthday=(sId.substr(6,4)+'-'+Number(sId.substr(10,2))+'-'+Number(sId.substr(12,2))).replace(/-/g,'/'),
      d = new Date(sBirthday)
    if(sBirthday != (d.getFullYear()+'/'+ (d.getMonth()+1) + '/' + d.getDate())) {
      return '身份证上的出生日期非法'
    }
    // 身份证号码校验
    var sum = 0,
      weights =  [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2],
      codes = '10X98765432'
    for (var i = 0; i < sId.length - 1; i++) {
      sum += sId[i] * weights[i]
    }
    // 计算出来的最后一位身份证号码
    var last = codes[sum % 11]
    if (sId[sId.length-1] != last) {
      return '你输入的身份证号非法'
    }
    return true
  }
}
